In a complex software environment implemented by a computer system, there are generic objects that may have many operations defined for them. However, not all operations are performed on all subclasses of these objects. The complexity of the software environment generally makes it difficult or inefficient to determine the subset of operations that are actually performed on a specific subclass of an object through merely examining the code.
In the software environment of an operating system (OS), one particular area of complexity is management of pages. An OS has many different types of pages and uses a variety of data structures to manage these pages. A page is a fixed-length contiguous block of virtual memory used by the OS for memory allocation for a program running on the OS, or for transfer between main memory and any other auxiliary store, such as a hard disk drive.
For example, in a Linux™ operating system (OS), a single class/type of object known as ‘struct page’ exists that represents a physical page frame of memory. However, there are many non-explicit subclasses of such a ‘struct page’ object. One such non-explicit subclass may hold the file data of one file system, while another non-explicit subclass may hold the metadata of a different file system, and yet another non-explicit subclass may be a buffer page used by hardware. Similarly, many functions operate on the ‘struct page’ object. It is often difficult and impractical to determine the subset of functions that are invoked on a certain subclass of ‘struct page’ under a certain workload by going through function graphs in the code.